package day_2022_4_to_7.nowcoder;

/**
 * 左旋转字符串
 * @author haomin
 * @date 2022/05/11 17:52
 **/
public class LeftRotateString_32f {
    public static void main(String[] args) {
        LeftRotateString("abcde",3);
        LeftRotateString2("abcde",3);


    }

    // 方法一 data[j] = data[j+1]
    public static String LeftRotateString(String str,int n) {
        if(str == null || str.length() == 0){
            return new String("");
        }
        char[] data = str.toCharArray();
        // 2. 左移k次即可
        for(int i = 0;i < n;i++){
            // 1. 向左移动一次，需要保存第一个，剩下的整体前移一个，第一个放在最后，完成一次移动
            char temp = data[0];
            for(int j = 0;j < data.length-1;j++){
                data[j] = data[j+1];
            }
            data[data.length -1] = temp;
        }
        String result = "";
        for(char a:data){
            result += a;
        }
        return result;
    }

    // 方法二 三遍数组逆置
    public static String LeftRotateString2(String str,int n) {
        if(str == null || str.length() == 0){
            return new String("");
        }
        n = n % str.length();

        char[] data = str.toCharArray();
        // 整体逆置
        inversion(data,0,data.length-1);
        // 将0-k位逆置
        inversion(data,0,data.length-1 - n);
        // 将(k+1)-末位逆置
        inversion(data,data.length - n,data.length-1);
        String result = "";
        for(char a:data){
            result += a;
        }
        //System.out.println(result.toString());
        return result;
    }

    private static void inversion(char[] data, int start, int end) {
        while (start < end){
            char temp = data[start];
            data[start] = data[end];
            data[end] = temp;
            start++;
            end--;
        }
    }
}